package com.servlet;

import com.service.BaseMyservice;
import com.service.Myservice;

import javax.servlet.*;
import javax.servlet.annotation.HandlesTypes;
import java.util.EnumSet;
import java.util.Set;

/**
 * 使用  HandlesTypes 注解可以在项目启动的时候个tomcat
 * 中添加组件， 感兴趣的类， 在servlet 3.0 tomcat 在启动的时候
 * 会自动扫描 所有jar 包下面的  META-INF/services/javax.servlet.ServletContainerInitializer （容器初始化器）
 * 文件中的内容， 里面填写的都是要注册组件的全类名， 然后就会把它的所有子类注册到
 * 容器中，  - 》 Set<Class<?>> arg0 也就是在这个里面， 这也就是我们添加的一些第三方组件能够注册到 tomcat
 * 中的原因。
 *
 * ServletContext 参数 代表的是当前web应用的 ServletContext ， 其中一个web应用是有一个 ServletContext
 *
 * 1、ServletContext 可以向我们web应用中注册 servlet \ filter \ listener
 * 2、使用编码的方式在 web 启动的时候给  ServletContext 中添加组件
 *          1、使用 ServletContainerInitializer 中的  ServletContext
 *          2、使用监听器中的ServletContextEvent 得到  ServletContext
 * @author Administrator
 */
@HandlesTypes({
        Myservice.class,
        BaseMyservice.class
})
public class MyServletContainerInitializer implements ServletContainerInitializer {
    @Override
    public void onStartup(Set<Class<?>> arg0, ServletContext sc) throws ServletException {
        System.out.println("感兴趣的类");
        arg0.forEach((o) -> System.out.println(o.getName()));

        ServletRegistration.Dynamic dynamic = sc.addServlet("UserServlet", new UserServlet());
        dynamic.addMapping("/user");

        FilterRegistration.Dynamic filter = sc.addFilter("UserFilter", new UserFilter());

        filter.addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST),true,"/**");

        sc.addListener(MyLister.class);
    }

}
